package Structures;

/**
 * Instancia una lista simple enlazada.
 * @author Jeremy
 * @author Rodrigo
 * @author Gabriel
 * @author Alexandre
 */
public class SLL {
    /**
     * Referencia al primer nodo de la lista.
     */
    private SLLNode _first;
    private int _size;
    
    /**
     * Crea una nueva lista simple enlazada con la referencia al primer elemento en nulo.
     */
    public SLL() {
        this._first = null;
        _size=0;
    }
    
    //////////////////////////////Getters y setters/////////////////////////////
    /**
     * Obtiene el primer elemento de la lista.
     * @return Primer nodo de la lista
     */
    public SLLNode getFirst(){
        return _first;
    }

    /**
     * Establece el enlace al primer nodo de la lista.
     * @param pFirst Nodo para establecer
     */
    public void setFirst(SLLNode pFirst) {
        this._first = pFirst;
    }
    
    ////////////////////////////////////////////////////////////////////////////
    
    /**
     * Inserta un nuevo nodo con su elemento a la lista.
     * @param pElem Elemento para el nodo a insertar
     */
    public void insert(Object pElem){
        _size++;
        SLLNode ins = new SLLNode(pElem, null);
        if (_first == null) {
            _first = ins;
            _first.setSucc(null);
        }
        else {
            SLLNode tmp = _first;
            while(tmp.getSucc() != null) {
                tmp = tmp.getSucc();
            }
            tmp.setSucc(ins);
            ins.setSucc(null);
        }
    }
    
    /**
     * Imprime en consola la lista con todos sus nodos.
     */
    public void printList() {
        SLLNode tmp = _first;
        while(tmp.getSucc() != null) {
            System.out.print(tmp.getElement() + "\t");
            tmp = tmp.getSucc();
        }
        System.out.println(tmp.getElement());
    }
    
    /**
     * Obtiene el tamano de la lista.
     * @return 
     */
    public int getSize() {
        return _size;
    }
    
    /**
     * Borra todos los elementos de la lista.
     */
    public void clear() {
        _first = null;
    }
}
